From 02b1cf005cf3e1df64183d20ba42930eb2767a9f Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Thu, 21 Aug 2025 06:57:36 +0000
Subject: (대표님, 최겸) 설계메뉴추가, 작업사항 업데이트 설계메뉴 - 문서관리
 설계메뉴 - 벤더 데이터 gtc 메뉴 업데이트 정보시스템 - 메뉴리스트 및 정보
 업데이트 파일 라우트 업데이트 엑셀임포트 개선 기본계약 개선 벤더 가입과정
 변경 및 개선 벤더 기본정보 - pq 돌체 오류 수정 및 개선 벤더 로그인 과정
 이메일 오류 수정
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../(engineering)/document-list-ship/page.tsx      | 141 +++++++++++++++++++++
 1 file changed, 141 insertions(+)
 create mode 100644 app/[lng]/engineering/(engineering)/document-list-ship/page.tsx

(limited to 'app/[lng]/engineering/(engineering)/document-list-ship/page.tsx')

diff --git a/app/[lng]/engineering/(engineering)/document-list-ship/page.tsx b/app/[lng]/engineering/(engineering)/document-list-ship/page.tsx
new file mode 100644
index 00000000..321ce909
--- /dev/null
+++ b/app/[lng]/engineering/(engineering)/document-list-ship/page.tsx
@@ -0,0 +1,141 @@
+// page.tsx (간단한 Promise 생성과 로그인 처리)
+import * as React from "react"
+import { type SearchParams } from "@/types/table"
+import { getValidFilters } from "@/lib/data-table"
+import { Skeleton } from "@/components/ui/skeleton"
+import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
+import { Shell } from "@/components/shell"
+import { searchParamsShipDocuCache } from "@/lib/vendor-document-list/validations"
+import { getServerSession } from "next-auth"
+import { authOptions } from "@/app/api/auth/[...nextauth]/route"
+import Link from "next/link"
+import { Button } from "@/components/ui/button"
+import { LogIn } from "lucide-react"
+import { getUserVendorDocumentStats, getUserVendorDocumentStatsAll, getUserVendorDocuments, getUserVendorDocumentsAll } from "@/lib/vendor-document-list/enhanced-document-service"
+import { UserVendorDocumentDisplay } from "@/components/ship-vendor-document/user-vendor-document-table-container"
+import { InformationButton } from "@/components/information/information-button"
+import { UserVendorALLDocumentDisplay } from "@/components/ship-vendor-document-all/user-vendor-document-table-container"
+interface IndexPageProps {
+    searchParams: Promise<SearchParams>
+}
+
+export default async function IndexPage(props: IndexPageProps) {
+    const searchParams = await props.searchParams
+    const search = searchParamsShipDocuCache.parse(searchParams)
+    const validFilters = getValidFilters(search.filters)
+
+    // Get session
+    const session = await getServerSession(authOptions)
+
+    // Check if user is logged in
+    if (!session || !session.user) {
+        return (
+            <Shell className="gap-6">
+                <div className="flex items-center justify-between">
+                    <div>
+                        <div className="flex items-center gap-2">
+                            <h2 className="text-2xl font-bold tracking-tight">
+                                문서 관리
+                            </h2>
+                            <InformationButton pagePath="partners/document-list-ship" />
+                        </div>
+                        {/* <p className="text-muted-foreground">
+                            소속 회사의 모든 도서/도면을 확인하고 관리합니다.
+                        </p> */}
+                    </div>
+                </div>
+
+                <div className="flex flex-col items-center justify-center py-12 text-center">
+                    <div className="rounded-lg border border-dashed p-10 shadow-sm">
+                        <h3 className="mb-2 text-xl font-semibold">로그인이 필요합니다</h3>
+                        <p className="mb-6 text-muted-foreground">
+                            문서를 확인하려면 먼저 로그인하세요.
+                        </p>
+                        <Button size="lg" asChild>
+                            <Link href="/partners">
+                                <LogIn className="mr-2 h-4 w-4" />
+                                로그인하기
+                            </Link>
+                        </Button>
+                    </div>
+                </div>
+            </Shell>
+        )
+    }
+
+    // User is logged in, get user ID
+    const requesterId = session.user.id ? Number(session.user.id) : null
+
+    if (!requesterId) {
+        return (
+            <Shell className="gap-6">
+                <div className="flex items-center justify-between">
+                    <div>
+                        <h2 className="text-2xl font-bold tracking-tight">
+                        Document Management
+                        </h2>
+                    </div>
+                </div>
+                <div className="flex flex-col items-center justify-center py-12 text-center">
+                    <div className="rounded-lg border border-dashed p-10 shadow-sm">
+                        <h3 className="mb-2 text-xl font-semibold">계정 오류</h3>
+                        <p className="mb-6 text-muted-foreground">
+                            사용자 정보가 올바르게 설정되지 않았습니다. 관리자에게 문의하세요.
+                        </p>
+                    </div>
+                </div>
+            </Shell>
+        )
+    }
+
+    // 검색 파라미터 정리
+    const searchInput = {
+        ...search,
+        filters: validFilters,
+    }
+
+    // Promise 생성 (모든 데이터를 페이지에서 처리)
+    const documentsPromise = getUserVendorDocumentsAll(requesterId, searchInput)
+    const statsPromise = getUserVendorDocumentStatsAll(requesterId)
+    
+    // Promise.all로 감싸서 전달
+    const allPromises = Promise.all([documentsPromise, statsPromise])
+    const statsResult = await documentsPromise
+
+
+    return (
+        <Shell className="gap-2">
+            <div className="flex items-center justify-between space-y-2">
+                <div>
+                    <h2 className="text-2xl font-bold tracking-tight">
+                    조선 Document Management
+                    </h2>
+                    <p className="text-muted-foreground">
+                  
+                    </p>
+                </div>
+            </div>
+
+            <React.Suspense fallback={<Skeleton className="h-7 w-52" />}>
+                {/* DateRangePicker can go here */}
+            </React.Suspense>
+
+            <React.Suspense
+                fallback={
+                    <DataTableSkeleton
+                        columnCount={8}
+                        searchableColumnCount={1}
+                        filterableColumnCount={3}
+                        cellWidths={["10rem", "30rem", "15rem", "15rem", "15rem", "15rem", "8rem", "8rem"]}
+                        shrinkZero
+                    />
+                }
+            >
+                <UserVendorALLDocumentDisplay
+                    allPromises={allPromises}
+                />
+            </React.Suspense>
+        </Shell>
+    )
+}
+
-- 
cgit v1.2.3

